#include "gpio.h"
#include "device.h"

void MX_GPIO_Init(void)
{
    // LED
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOC);

    // LED输出初始化
    gpio_init(LED_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,LED_Pin);

    // USART0_EN输出初始化
    gpio_init(USART0_EN_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, USART0_EN_PIN);
    USART_EN_IN; //初始开启接收使能

    // XYZM电机到位光耦初始化
    gpio_init(X_AT_HOME_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, X_AT_HOME_PIN);
    gpio_init(Y_AT_HOME_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, Y_AT_HOME_PIN);
    gpio_init(Z_AT_HOME_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, Z_AT_HOME_PIN);
    gpio_init(M_AT_HOME_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, M_AT_HOME_PIN);

    // XYZM电机方向输出初始化
    gpio_init(X_DIR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, X_DIR_PIN);
    gpio_init(Y_DIR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Y_DIR_PIN);
    gpio_init(Z_DIR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Z_DIR_PIN);
    gpio_init(M_DIR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, M_DIR_PIN);

    // XYZM电机使能输出初始化
    gpio_init(X_EN_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, X_EN_PIN);
    gpio_init(Y_EN_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Y_EN_PIN);
    gpio_init(Z_EN_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Z_EN_PIN);
    gpio_init(M_EN_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, M_EN_PIN);

    // XYZM电机锁输出初始化
    gpio_init(X_LOCK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, X_LOCK_PIN);
    gpio_init(Y_LOCK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Y_LOCK_PIN);
    gpio_init(Z_LOCK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, Z_LOCK_PIN);
    gpio_init(M_LOCK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, M_LOCK_PIN);

    // 抓杯传感器
    gpio_init(ZHOD_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, ZHOD_PIN);
    gpio_init(ZLIM_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, ZLIM_PIN);

    // // 关闭所有电机使能
    IO_X_EN(0);
    IO_Y_EN(0);
    IO_Z_EN(0);
    IO_M_EN(0);
}

// GPIO翻转函数
void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin)
{
    if (gpio_input_bit_get(gpio_periph, pin) == RESET) {
        gpio_bit_write(gpio_periph, pin, SET);
    } else {
        gpio_bit_write(gpio_periph, pin, RESET);
    }
}

